package com.ld;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.apache.commons.io.FilenameUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.core.io.Resource;

import com.ld.admin.websocket.chat.WebSocketUtil;
import com.ld.common.config.web.LdGlobal;
import com.ld.shieldsb.common.core.io.IOUtils;
import com.ld.shieldsb.common.core.io.PropertiesUtils;
import com.ld.shieldsb.common.core.io.ResourceUtils;
import com.ld.shieldsb.common.core.util.PathUtil;
import com.ld.shieldsb.common.web.util.server.WebServerModel;
import com.ld.shieldsb.common.web.util.server.WebServerUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * 项目启动类
 * 
 * @ClassName ShieldSbApplication
 * @author <a href="253044554@qq.com" target="_blank">吕凯</a>
 * @date 2018年9月10日 上午11:10:46
 *
 */
@SpringBootApplication
@EnableCaching
@ServletComponentScan
@Slf4j
public class ShieldSbApplication extends SpringBootServletInitializer {

    // 外部tomcat 需要项目路径
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebServerModel server = WebServerUtil.getWebServer(servletContext);
        LdGlobal.setProjectPort(server.getPort()); // 覆盖，否则默认是从配置文件中读取的
        LdGlobal.setProjectName(server.getProjectName());
        super.onStartup(servletContext);
    }

    // 外部tomcat 处理配置文件
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//        String extDirs = PathUtil.getSystemProperty("java.ext.dirs");
//        System.setProperty("java.ext.dirs", extDirs + ";C:\\Users\\kevin\\extlib");

        log.warn("访问地址(configure)：：" + LdGlobal.getProjectBaseURL()); // 此处必需调用，加载额外的配置文件
        WebSocketUtil.setWSTomcatEmbed(false);
        builder.properties(PropertiesUtils.getInstance().getProperties()); // 放到容器中时
        return builder.sources(ShieldSbApplication.class);
    }

    // 内置容器启动
    public static void main(String[] args) {
        String protocol = ShieldSbApplication.class.getProtectionDomain().getCodeSource().getLocation().getProtocol();
        if ("jar".equals(protocol)) { // jar包或war包运行
            // 执行一些预处理
            checkPropertiesFile();

        }
        log.warn("访问地址：：" + LdGlobal.getProjectBaseURL()); // 此处必需调用，加载额外的配置文件
        WebSocketUtil.setWSTomcatEmbed(true);
        SpringApplication app = new SpringApplication(ShieldSbApplication.class);
        // 加载配置文件的变量 @PropertySource({"classpath:config.properties", "classpath:db.properties" //如果是相同的key，则最后一个起作用 })
        app.setDefaultProperties(PropertiesUtils.getInstance().getProperties());
        app.run(args);
    }

    /**
     * 检查配置文件
     * 
     * @Title checkPropertiesFile
     * @author 吕凯
     * @date 2019年4月13日 上午10:06:40 void
     */
    private static void checkPropertiesFile() {
        String userDir = PathUtil.getUserDir();
        System.out.println(userDir);
        File applicationFile = new File(userDir, FilenameUtils.getName("application.properties")); // 判断文件是否存在
        if (!applicationFile.exists()) {
            IOUtils.readResource2File("/application.properties", applicationFile);
        }
        Resource[] resources = ResourceUtils.getResources("classpath:/properties/*");
        for (Resource resource : resources) {
            File propertiesFiles = new File(userDir + File.separator + "properties/", FilenameUtils.getName(resource.getFilename())); // 判断文件是否存在
            if (!propertiesFiles.getParentFile().exists()) {
                propertiesFiles.getParentFile().mkdirs();
            }
            if (!propertiesFiles.exists()) {
                try {
                    IOUtils.readResource2File(resource.getInputStream(), propertiesFiles);
                } catch (IOException e) {
                    log.error("", e);
                }
            }
        }
    }

}
